home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 October / Gamestar_77_2005-10_dvd.iso / Dema / betonsoldier_spdemo.exe / {app} / Shaders / orientable_particle.fx < prev    next >
Encoding:
Text File  |  2005-05-05  |  4.1 KB  |  114 lines

  1. //------------------------------------------------------------------------------------------------------
  2. //------------------------------------------------------------------------------------------------------
  3. //------------------------------------------------------------------------------------------------------
  4.  
  5. #define FOG_DISABLE
  6. #include "fog.fx"
  7.  
  8. shared float3 OrientableParticlePosition[4] = 
  9. {
  10.     {-0.5f,0.5f,0.0f},
  11.     {0.5f,0.5f,0.0f},
  12.     {0.5f,-0.5f,0.0f},
  13.     {-0.5f,-0.5f,0.0f}
  14. };
  15.  
  16. //------------------------------------------------------------------------------------------------------
  17.  
  18. shared float2 OrientableParticleUv[4] = 
  19. {
  20.     {0.0f,0.0f},
  21.     {1.0f,0.0f},
  22.     {1.0f,1.0f},
  23.     {0.0f,1.0f}
  24. };
  25.  
  26. //------------------------------------------------------------------------------------------------------
  27. //------------------------------------------------------------------------------------------------------
  28. //------------------------------------------------------------------------------------------------------
  29.  
  30. struct    CVertexShaderInput
  31. {
  32.     float4    ParticleMatrix_O    :    POSITION;
  33.     float    IndexVertexParticle    :    PSIZE;
  34.     float4    ParticleColor        :    COLOR0;
  35.     float3    ParticleMatrix_I    :    TEXCOORD0;
  36.     float3    ParticleMatrix_J    :    TEXCOORD1;
  37.     float3    ParticleMatrix_K    :    TEXCOORD2;
  38. };
  39.  
  40. //------------------------------------------------------------------------------------------------------
  41.  
  42. struct    CVertexShaderOutput
  43. {
  44.     float4    Position        :    POSITION;
  45.     float4    ParticleColor    :    COLOR0;
  46.     float2    ParticleUv        :    TEXCOORD0;
  47.     FOG_OPTION_VERTEX_FIELD
  48. };
  49.  
  50. //------------------------------------------------------------------------------------------------------
  51. //------------------------------------------------------------------------------------------------------
  52. //------------------------------------------------------------------------------------------------------
  53.  
  54. CVertexShaderOutput    OrientableParticleVSProcess (const CVertexShaderInput input);
  55.  
  56. //------------------------------------------------------------------------------------------------------
  57. //------------------------------------------------------------------------------------------------------
  58. //------------------------------------------------------------------------------------------------------
  59.  
  60. CVertexShaderOutput    OrientableParticleVSProcess (const CVertexShaderInput input)
  61. {
  62.     CVertexShaderOutput output;
  63.                                   
  64.     matrix particleMatrix;
  65.     float4 particleCameraTranslation;
  66.  
  67.     particleMatrix[0].xyz = input.ParticleMatrix_I.xyz;
  68.     particleMatrix[1].xyz = input.ParticleMatrix_J.xyz;
  69.     particleMatrix[2].xyz = input.ParticleMatrix_K.xyz;
  70.     particleMatrix[3].xyz = input.ParticleMatrix_O.xyz;
  71.     particleMatrix[0].w = 0.0f;
  72.     particleMatrix[1].w = 0.0f;
  73.     particleMatrix[2].w = 0.0f;
  74.     particleMatrix[3].w = 1.0f;
  75.     
  76.     float3 scale;
  77.     scale.x = length(particleMatrix[0]);
  78.     scale.y = length(particleMatrix[1]);
  79.     scale.z = length(particleMatrix[2]);
  80.     
  81.     particleMatrix[0].xyz /= scale.x;
  82.     particleMatrix[1].xyz /= scale.y;
  83.     particleMatrix[2].xyz /= scale.z;
  84.     
  85.     particleCameraTranslation = mul(particleMatrix[3],InverseCamera);
  86.     
  87.     particleMatrix = mul (particleMatrix,OrientedViewMatrix);
  88.     
  89.     particleMatrix[3] = particleCameraTranslation;
  90.  
  91.     float4 cameraParticlePosition;
  92.     cameraParticlePosition.xyz = OrientableParticlePosition[input.IndexVertexParticle];
  93.     cameraParticlePosition.w = 1.0f;
  94.     
  95.     particleMatrix[0].xyz *= scale.x;
  96.     particleMatrix[1].xyz *= scale.y;
  97.     particleMatrix[2].xyz *= scale.z;
  98.             
  99.     cameraParticlePosition = mul (cameraParticlePosition,particleMatrix);
  100.     cameraParticlePosition.z = - cameraParticlePosition.z;
  101.     
  102.     output.Position = mul (cameraParticlePosition,Projection);
  103.     output.ParticleUv = OrientableParticleUv[input.IndexVertexParticle];
  104.     output.ParticleColor = input.ParticleColor;
  105.     
  106.     // fog computation
  107.     FOG_OPTION_COMPUTE(output, output.Position);
  108.     
  109.     return output;
  110. }
  111.  
  112. //------------------------------------------------------------------------------------------------------
  113. //------------------------------------------------------------------------------------------------------
  114. //------------------------------------------------------------------------------------------------------